Vorhersage (Klassifikation) betrügerischer Kontotransationen

Solution Engineering in R

Daniel Borsos, Valerie Högerle, Michaela Hubweber, Florian Ye

2024-05-19

Explorative Datenanalyse

Erste Einblicke in die Daten

  step     type   amount    nameOrig oldbalanceOrg newbalanceOrig    nameDest
1    1  PAYMENT  9839.64 C1231006815        170136      160296.36 M1979787155
2    1  PAYMENT  1864.28 C1666544295         21249       19384.72 M2044282225
3    1 TRANSFER   181.00 C1305486145           181           0.00  C553264065
4    1 CASH_OUT   181.00  C840083671           181           0.00   C38997010
5    1  PAYMENT 11668.14 C2048537720         41554       29885.86 M1230701703
6    1  PAYMENT  7817.71   C90045638         53860       46042.29  M573487274
  oldbalanceDest newbalanceDest isFraud isFlaggedFraud
1              0              0       0              0
2              0              0       0              0
3              0              0       1              0
4          21182              0       1              0
5              0              0       0              0
6              0              0       0              0

Datenstruktur

Im Verlauf der EDA lässt sich erkennen, dass beim Fraud die Veränderung der Kontostände eine wichtige Rolle spielen. Daher werden die Variablen “change.balanceOrg”, “increase.balanceDest” und “flagFraud” erstellt.

  • “change.balanceOrg”: Differenz zwischen dem alten und neuen Kontostand des Absenders
  • “increase.balanceDest”: Differenz zwischen dem neuen und alten Kontostand des Empfängers
  • “flagFraud”: Wenn der Empfänger einen Kontostand von 0 hat und der Absender den gesamten Betrag überweist, wird die Variable auf 1 gesetzt.
'data.frame':   6362620 obs. of  14 variables:
 $ step                : int  1 1 1 1 1 1 1 1 1 1 ...
 $ type                : Factor w/ 5 levels "CASH_IN","CASH_OUT",..: 4 4 5 2 4 4 4 4 4 3 ...
 $ amount              : num  9840 1864 181 181 11668 ...
 $ nameOrig            : chr  "C1231006815" "C1666544295" "C1305486145" "C840083671" ...
 $ oldbalanceOrg       : num  170136 21249 181 181 41554 ...
 $ newbalanceOrig      : num  160296 19385 0 0 29886 ...
 $ nameDest            : chr  "M1979787155" "M2044282225" "C553264065" "C38997010" ...
 $ oldbalanceDest      : num  0 0 0 21182 0 ...
 $ newbalanceDest      : num  0 0 0 0 0 ...
 $ isFraud             : Factor w/ 2 levels "No","Yes": 1 1 2 2 1 1 1 1 1 1 ...
 $ isFlaggedFraud      : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ change.balanceOrg   : num  9840 1864 181 181 11668 ...
 $ increase.balanceDest: num  0 0 0 -21182 0 ...
 $ flagFraud           : Factor w/ 2 levels "No","Yes": 1 1 2 2 1 1 1 1 1 1 ...

Fehlende Werte

[1] "Anzahl fehlender Werte: 0"

Aufverteilung der abhängigen Variable

[1] "isFraud Verteilung in Prozent"

   No   Yes 
99.87  0.13 
[1] "isFlaggedFraud Verteilung in absoluten Zahlen"

     No     Yes 
6362604      16 
[1] "Selbst erstellte Variable flagFraud Verteilung in Prozent"

   No   Yes 
99.87  0.13 

Bei isFlaggedFraud ist die Anzahl der betrügerischen Transaktionen mit 16 sehr gering und wird daher aus dem Datensatz entfernt. Bei flagFraud ist zu sehen, dass sie eine ähnliche Verteilung wie isFraud aufweist.

Univariate Analyse

Numerische Variablen:

Für die rechtsschiefen Variablen wird eine Log-Transformation durchgeführt, um die Verteilung zu normalisieren.

Kategoriale Variablen:

Bivariate Analyse

Korrelationsmatrix:

Density Plots im Vergleich nach Fraud-Status:

  • Betrügerische Transaktionen haben tendenziell höhere Beträge.
  • oldbalanceOrg liegt bei notFraud bei einem Großteil bei 0. Bei Fraud ist dies nicht der Fall
  • change.balanceOrg: der abgegangene Betrag ist bei Fraud klar höher.

Barplot nach Typ und Fraud-Status:

Zu erkennen: Es sind nur betrügerische Transaktionen bei den Typen “CASH_OUT” und “TRANSFER” vorhanden. Diese werden näher betrachtet.

CASH_OUT Transaktionen:

  • oldbalanceOrig: bei notFraud liegt der Betrag größtenteils bei 0, bei Fraud ist der Kontostand so ziemlich nie bei 0. Im Durchschnitt auch eindeutig höher.
  • newbalanceOrig: bei Fraud liegt der Betrag dann größtenteils bei 0 (Konto geplündert).
  • change.balanceOrg: nochmal zu sehen, dass der abgegangene Betrag bei Fraud klar höher ist.

TRANSFER Transaktionen

  • oldbalanceOrig: bei notFraud liegt der Betrag größtenteils bei 0, bei Fraud ist der Kontostand so ziemlich nie bei 0. Im Durchschnitt auch eindeutig höher.
  • oldbalanceDest & newbalanceDest: das Seltsame ist, dass Fraud ziemlich genau bei 0, aber newbalanceDest ebenfalls bei 0 liegt.
  • change.balanceOrg: nochmal zu sehen, dass der abgegangene Betrag bei Fraud klar höher ist.

Confusion Matrix für flagFraud:

Überprüfung der Konten

Überprüfen, ob das Konto, von dem die Transaktion ausgeht, mehrere betrügerische Transaktionen durchführt.

  nameOrig_count Frequency
1              1      8213

Überprüfen, ob das Konto, auf das die Transaktion erfolgt, mehrere betrügerische Transaktionen erhält.

  nameDest_count Frequency
1              1      8125
2              2        44

Überprüfen, wie viele Konten, von dem die Transaktion ausgehen, auch Transaktionen ohne Betrug durchführt haben.

  Fraud_nameOrg_in_nonFraud Frequency
1                         0      8185
2                         1        28

Überprüfen, ob Transaktionen zwischen denselben Konten existieren.

  Count
1     0